package model.compresion.PPMC;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import model.registro.ConversionesTiposDatos;
import model.registro.Registro;
import model.registro.RegistroPosicionFrecuencia;

//la idea basica de que extienda de "Registro" es que permite guadar 
//las cosas en un archivo segun el modelo 

public class ContextoPPMC extends Registro{

	    private String contexto;
	    private ArrayList<RegistroPosicionFrecuencia> arrayPosFrecuencia; 
	    private int total;
	   	    
	    public ContextoPPMC(String NewContexto){
	    	this.contexto = new String(NewContexto);
	    	this.arrayPosFrecuencia = new ArrayList<RegistroPosicionFrecuencia>();
	    	this.total=0;
		}
			    
	 
	   public ContextoPPMC() {
		}
	    
	    public String getContexto() {
			return contexto;
		}
		public void setContexto(String contexto) {
			this.contexto = contexto;
		}
		public ArrayList<RegistroPosicionFrecuencia> getArrayPosFrecuencia() {
	 		return arrayPosFrecuencia;
		}
		public void setArrayPosFrecuencia(ArrayList<RegistroPosicionFrecuencia> simbolo) {
			this.arrayPosFrecuencia = simbolo;
		}
		
		public int getTamanioRegistro() {
			RegistroPosicionFrecuencia reg = new RegistroPosicionFrecuencia();
			return contexto.getBytes().length + arrayPosFrecuencia.size()* reg.getTamanioRegistro()+ 3 *ConversionesTiposDatos.sizeOfInt();	
		}

		public byte[] convertirRegistroABytes() throws IOException{

			ByteArrayOutputStream bytesRegistro = new ByteArrayOutputStream();
			DataOutputStream output = new DataOutputStream(bytesRegistro);		
			        
			output.writeInt(total);
	        output.writeInt(contexto.length());
	        output.write(contexto.getBytes());
	        
	        output.writeInt(arrayPosFrecuencia.size());
			
			//int i = 0;
			for(RegistroPosicionFrecuencia reg : arrayPosFrecuencia){
				//output.writeInt(reg.getTamanioRegistro());
				//System.out.println(i);
				output.write(reg.convertirRegistroABytes());
				//i++;
			}
			
			/*
			
			
			for (int i = 0; i < arraySimbolos.size(); i++) {
				output.writeInt(arraySimbolos.get(i).getTamanioRegistro());
				System.out.println(i);
				output.write(arraySimbolos.get(i).convertirRegistroABytes());
			}
			*/
	        
			        
	        return bytesRegistro.toByteArray();

		}

		public void convertirBytesARegistro(byte[] xInput) throws IOException {

			ByteArrayInputStream bytesRegistro = new ByteArrayInputStream(xInput);
			DataInputStream input = new DataInputStream(bytesRegistro);

			this.arrayPosFrecuencia = new ArrayList<RegistroPosicionFrecuencia>();

			this.total = input.readInt();
			int tamanioPalabra = input.readInt();
			byte[] bytesTermino = new byte[tamanioPalabra];
			
			input.read(bytesTermino);
			contexto = new String(bytesTermino);
			
			RegistroPosicionFrecuencia reg = new RegistroPosicionFrecuencia();

			int tamanioArray = input.readInt();
			//int tamanioList= input.readInt();
			// System.out.println("el tamanio de la lista es: "+tamanioList);
			for (int i = 0; i < tamanioArray; i++) {
				//System.out.println(i);
				//int tamanioRegistroSimbolo = input.readInt();
				byte[] registroBytes = new byte[reg.getTamanioRegistro()];
				//byte[] registroBytes = new byte[tamanioRegistroSimbolo];
				RegistroPosicionFrecuencia rs = new RegistroPosicionFrecuencia();
				input.read(registroBytes);
				rs.convertirBytesARegistro(registroBytes);

				arrayPosFrecuencia.add(rs);
			}

		}


		public int getTotal() {
			return total;
		}


		public void setTotal(int total) {
			this.total = total;
		}

		public void aumentarTotal(){
			this.total++;
		}
	}
